package org.ktpro.shortlink.admin.remote.dto;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.ktpro.shortlink.admin.common.convention.result.Result;
import org.ktpro.shortlink.admin.remote.dto.req.*;
import org.ktpro.shortlink.admin.remote.dto.resp.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * 短链接中台服务远程调用
 */
@FeignClient(value = "short-link-project", url = "${aggregation.remote-url:}") //指定远程调用的服务，如果启动聚合服务，则不是请求Nacos获取服务地址，而是本地
public interface ShortLinkFeignRemoteService {
    /**
     * 创建短链接远程调用
     */
    @PostMapping("api/short-link/v1/create")
    Result<ShortLinkCreateRespDTO> create(@RequestBody ShortLinkCreateReqDTO requestParam);

    /**
     * 批量创建短链接
     *
     * @param requestParam 批量创建短链接请求参数
     * @return 短链接批量创建响应
     */
    @PostMapping("api/short-link/v1/create/batch")
    Result<ShortLinkBatchCreateRespDTO> batchCreateShortLink(ShortLinkBatchCreateReqDTO requestParam);

    /**
     * 修改短链接远程调用
     */
    @PostMapping("api/short-link/v1/update")
    void updateShortLink(ShortLinkUpdateReqDTO requestParam);


    /**
     * 分页查询短链接远程调用
     */
    //这里有个坑，不能通过对象传递分页查询参数，因为某些序列化问题，而且返回也不能是接口IPage类型，而应该是其实现类 Page
    @GetMapping("api/short-link/v1/page")
    Result<Page<ShortLinkPageRespDTO>> pageShortLink(@RequestParam("gid") String gid,
                                                     @RequestParam("orderTag") String orderTag,
                                                     @RequestParam("current") Long current,
                                                     @RequestParam("size") Long size);

    /**
     * 短链接分组对应的短链接数量查询远程调用
     */
    @GetMapping("api/short-link/v1/count")
    Result<List<ShortLinkGroupCountQueryRespDTO>> listGroupShortLinkCount(@RequestParam("requestParam") List<String> requestParam);

    /**
     * 获取网页标题远程调用接口
     */
    @GetMapping("/api/short-link/v1/title")
    Result<String> getTitleByUrl(@RequestParam("url") String url);


    //下面是回收站相关远程调用s

    /**
     * 移进回收站
     */
    @PostMapping("api/short-link/v1/recycle-bin/save")
    void saveRecycleBin(@RequestBody RecycleBinReqDTO requestParam);

    /**
     * 移出回收站
     */
    @PostMapping("api/short-link/v1/recycle-bin/recover")
    void removeRecycleBin(@RequestBody RecycleBinReqDTO requestParam);

    /**
     * 完全删除短链接
     */
    @PostMapping("api/short-link/v1/recycle-bin/remove")
    void removeFullyRecycleBin(@RequestBody RecycleBinRemoveReqDTO requestParam);

    /**
     * 分页查询回收站短链接
     *
     * @param gidList 分组标识集合
     * @param current 当前页
     * @param size    当前数据多少
     * @return 查询短链接响应
     */
    @GetMapping("/api/short-link/v1/recycle-bin/page")
    Result<Page<ShortLinkPageRespDTO>> pageRecycleBinShortLink(@RequestParam("gidList") List<String> gidList,
                                                               @RequestParam("current") Long current,
                                                               @RequestParam("size") Long size);

// 下面是短链接监控远程调用接口

    /**
     * 访问单个短链接指定时间内监控数据
     *
     * @param fullShortUrl 完整短链接
     * @param gid          分组标识
     * @param startDate    开始时间
     * @param endDate      结束时间
     * @return 短链接监控信息
     */
    @GetMapping("/api/short-link/v1/stats")
    Result<ShortLinkStatsRespDTO> oneShortLinkStats(@RequestParam("fullShortUrl") String fullShortUrl,
                                                    @RequestParam("gid") String gid,
                                                    @RequestParam("startDate") String startDate,
                                                    @RequestParam("endDate") String endDate);

    /**
     * 短链接访客记录监控分页查询
     */
    @GetMapping("api/short-link/v1/stats/access-record")
    Result<Page<ShortLinkStatsAccessRecordRespDTO>> pageLinkStatsAccessRecord(@RequestParam("fullShortUrl") String fullShortUrl,
                                                                              @RequestParam("gid") String gid,
                                                                              @RequestParam("startDate") String startDate,
                                                                              @RequestParam("endDate") String endDate,
                                                                              @RequestParam("enableStatus") Integer enableStatus,
                                                                              @RequestParam("current") Long current,
                                                                              @RequestParam("size") Long size);

    /**
     * 访问分组短链接指定时间内监控数据
     */
    @GetMapping("api/short-link/v1/stats/group")
    Result<ShortLinkStatsRespDTO> groupShortLinkStats(@RequestParam("gid") String gid,
                                                      @RequestParam("startDate") String startDate,
                                                      @RequestParam("endDate") String endDate);


    /**
     * 短链接分组访问记录分页查询
     */
    @GetMapping("api/short-link/v1/stats/access-record/group")
    Result<Page<ShortLinkStatsAccessRecordRespDTO>> pageLinkStatsAccessRecordByGroup(@RequestParam("gid") String gid,
                                                                                     @RequestParam("startDate") String startDate,
                                                                                     @RequestParam("endDate") String endDate,
                                                                                     @RequestParam("current") Long current,
                                                                                     @RequestParam("size") Long size);

}
